
# 优化器
class Optimizer:
    def __init__(self):
        self.target = None
        self.hooks = []

    # 通过setup方法将作为类实例（Model或Layer）的参数变量设定为target实例变量
    def setup(self, target):
        self.target = target
        return self

    # 对除grad实例变量为None的参数之外的其他参数进行更新
    def update(self):
        """
        更新模型的参数。

        Raises:
            RuntimeError: 如果出现错误，引发运行时错误。
        """

        try:
            # 将None之外的参数汇总到列表
            params = [p for p in self.target.params() if p.grad is not None]

            for f in self.hooks:
                f(params)

            for param in params:
                self.update_one(param)

        except Exception as e:
            raise RuntimeError("更新模型参数时出现错误：" + str(e))

    # 具体更新方法
    def update_one(self, param):
        raise NotImplementedError

    # 进行预处理
    # 添加进行预处理的函数，这个机制可用于权重衰减和梯度裁剪
    def add_hook(self, f):
        self.hooks.append(f)
